/**
 * Copyright (c) 2006-2015, JGraph Ltd
 * Copyright (c) 2006-2015, Gaudenz Alder
 */
var mxObjectIdentity =
    {
        /**
         * Class: mxObjectIdentity
         *
         * Identity for JavaScript objects and functions. This is implemented using
         * a simple incrementing counter which is stored in each object under
         * <FIELD_NAME>.
         *
         * The identity for an object does not change during its lifecycle.
         *
         * Variable: FIELD_NAME
         *
         * Name of the field to be used to store the object ID. Default is
         * <code>mxObjectId</code>.
         */
        FIELD_NAME: 'mxObjectId',

        /**
         * Variable: counter
         *
         * Current counter.
         */
        counter: 0,

        /**
         * Function: get
         *
         * Returns the ID for the given object or function or null if no object
         * is specified.
         */
        get: function(obj)
        {
            if (obj != null)
            {
                if (obj[mxObjectIdentity.FIELD_NAME] == null)
                {
                    if (typeof obj === 'object')
                    {
                        var ctor = mxUtils.getFunctionName(obj.constructor);
                        obj[mxObjectIdentity.FIELD_NAME] = ctor + '#' + mxObjectIdentity.counter++;
                    }
                    else if (typeof obj === 'function')
                    {
                        obj[mxObjectIdentity.FIELD_NAME] = 'Function#' + mxObjectIdentity.counter++;
                    }
                }

                return obj[mxObjectIdentity.FIELD_NAME];
            }

            return null;
        },

        /**
         * Function: clear
         *
         * Deletes the ID from the given object or function.
         */
        clear: function(obj)
        {
            if (typeof(obj) === 'object' || typeof obj === 'function')
            {
                delete obj[mxObjectIdentity.FIELD_NAME];
            }
        }

    };
